package org.maiyoframework.core.jpa;

import java.io.Serializable;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.maiyoframework.core.web.page.Page;

/**
 * JPA DAO基类 
 * 提供保存、更新、查询、删除等常用方法
 * 
 * @author maiYo
 * 
 * @param <T>
 */
public interface BaseDao<T extends Serializable> {

	/**
	 * 持久化对象
	 * 
	 * @param entity
	 *            目标对象
	 * @return 已持久化对象
	 */
	public T save(T entity);

	/**
	 * 批量删除对象
	 * 
	 * @param ids
	 *            主键集合
	 * @return 删除数量
	 */
	public Integer deleteAll(Serializable... ids);

	/**
	 * 通过ID删除对象,如果对象不存在，则返回null
	 * 
	 * @param id
	 *            主键
	 * @return 已删除对象
	 */
	public T deleteById(Serializable id);
	
	/**
	 * 删除对象
	 * 
	 * @param entity
	 *            目标对象
	 */
	public void delete(T entity);

	/**
	 * 保存或更新对象
	 * 同Hibernate saveOrUpdate
	 * 在不明确对象为PO或TO时调用
	 * 
	 * @param entity
	 *            目标对象
	 * @return 已更新对象
	 */
	public T saveOrUpdate(T entity);
	
	/**
	 * 动态更新对象.
	 * 自动将非空成员Set到持久化对象中.
	 * 目标对象必须包含持久化对象的主键标示符
	 * 
	 * @param entity
	 *            目标对象，不能是通过find方法查找的持久化对象，
	 *            而是如：页面提交并封装的实体，同时包含主键标识
	 * @return 已更新对象
	 */
	public T updateDynamic(T entity);
	
	/**
	 * 通过ID查询对象
	 * 
	 * @param id
	 *            主键
	 * @return 被查询对象　
	 */
	public T findById(Serializable id);

	/**
	 * 通过Finder对象查找唯一对象
	 * 
	 * @param finder
	 *            查询辅助类
	 * @return 唯一对象
	 */
	public T findUnique(Finder finder);

	/**
	 * 获取分页记录
	 * 
	 * @param finder
	 *            查询辅助类
	 * @param req
	 *            HttpServletRequest 为Web环境中获取请求路径getRequestURI
	 * @param pageNo
	 *            当前页
	 * @param pageSize
	 *            每页显示记录数
	 * @param pageCount
	 *            页码数量，-1为使用默认(11)
	 * @return 分页对象(包括记录集与页码)
	 */
	public Page<T> findPage(Finder finder, HttpServletRequest req, Integer pageNo,
			Integer pageSize, int pageCount);

	/**
	 * 获取记录列表
	 * 
	 * @param finder
	 *            查询辅助类
	 * @param start
	 *            开始记录
	 * @param maxSize
	 *            每次最大记录
	 * @return 记录列表
	 */
	public List<T> findList(Finder finder, int start, int maxSize);

	/**
	 * 获取全部记录列表
	 * 
	 * @param finder
	 *            查询辅助类
	 * @return 全部记录列表
	 */
	public List<T> findList(Finder finder);

	/**
	 * 统计记录集数量
	 * 
	 * @param finder
	 *            查询辅助类
	 * @return 记录集数量
	 */
	public Long countResult(Finder finder);

}
